﻿// <com.woyouqiu.Copyright>
// --------------------------------------------------------------
// <copyright>上海有求网络科技有限公司 2015</copyright>
// <Solution>Vecen.BangChuang</Solution>
// <Project>Vecen.BangChuang.Core</Project>
// <FileName>SignHelper.cs</FileName>
// <CreateTime>2017-06-21 21:39</CreateTime>
// <Author>何苗</Author>
// <Email>hemiao@woyouqiu.com</Email>
// <log date="2017-06-21 21:39" version="00001">创建</log>
// --------------------------------------------------------------
// </com.woyouqiu.Copyright>

using System;
using System.Collections.Generic;
using System.Text;

namespace Vecen.BangChuang.Helpers {
    public class SignHelper {
        /**
    * 使用<code>secret</code>对paramValues按以下算法进行签名： <br/>
    * uppercase(hex(sha1(secretkey1value1key2value2...secret))
    *
    * @param paramNames  需要签名的参数名
    * @param paramValues 参数列表
    * @param secret
    * @return
    */
        public static string Sign(Dictionary<string, string> paramValues, string secret) {
            return Sign(paramValues, null, secret);
        }

        /**
     * 对paramValues进行签名，其中ignoreParamNames这些参数不参与签名
     * @param paramValues
     * @param ignoreParamNames
     * @param secret
     * @return
     */
        public static string Sign(Dictionary<string, string> paramValues,
            List<string> ignoreParamNames,
            string secret) {
            StringBuilder sb = new StringBuilder();
            List<string> paramNames = new List<string>(paramValues.Count);
            paramNames.AddRange(paramValues.Keys);
            if(ignoreParamNames != null && ignoreParamNames.Count > 0) {
                foreach(string ignoreParamName in ignoreParamNames) {
                    paramNames.Remove(ignoreParamName);
                }
            }
            paramNames.Sort();

            sb.Append(secret);
            foreach(string paramName in paramNames) {
                sb.Append(paramName).Append(paramValues[paramName]);
            }
            sb.Append(secret);
            var sha1DigestStr = CommonHelper.GetSha1(sb.ToString());
            return sha1DigestStr;
        }
    }
}